use std::fs::File;
use std::io::{BufRead, BufReader, Read, Write};
use std::path::PathBuf;

pub fn file_demo_test() {
    // 获取当前文件的路径
    let file_path = file!();    // 当前文件路径: rust-file-directory/src/main.rs
    println!("Current file path: {}", file_path);

    // PathBuf 类型可以方便地操作文件路径, 例如添加目录、设置扩展名等
    let directory = PathBuf::from(file_path);
    // 一个目录是否存在父目录必须通过 parent() 方法判断，并使用模式匹配处理 Option 类型
    if let Some(parent) = directory.parent() {
        println!("Parent directory: {}", parent.display());
        let file_path = parent.join("example.txt");
        println!("File path: {}", file_path.display());

        // 在 directory 目录中创建一个新文件 example.txt
        // 文件路径不可以是 / 开头，否则会报错
        let mut file = File::create(&file_path).unwrap();
        file.write_all(b"Hello, world!").unwrap();

        // 打开并读取文件内容
        match File::open(&file_path) {
            Ok(mut file) => {
                let mut contents = String::new();
                file.read_to_string(&mut contents).unwrap();
                println!("Contents of {:?}:\n{}", file_path, contents);
            },
            Err(e) => println!("Error: {}", e),
        }

        // 有时候你可能需要更细粒度的控制，例如逐行读取文件或使用缓冲流来提高性能。这时你可以使用 std::fs::File 和 std::io::BufReader。
        match File::open(&file_path) {
            Ok(file) => {
                println!("逐行读取文件内容!");
                let reader = BufReader::new(file);
                for line in reader.lines() {
                    match line {
                        Ok(line) => println!("{}", line),
                        Err(e) => eprintln!("无法读取行: {}", e),
                    }
                }
            },
            Err(e) => eprintln!("无法打开文件: {}", e),
        }
    }

    // 创建一个
    let mut path = PathBuf::new();
    path.push(r"C:\");
    path.push("windows");
    path.push("system32");
    path.set_extension("dll");
    println!("{:?}", path);


    // 读取当前文件所在目录下的 logo.txt 文件内容
    let readme = include_str!("greeting.txt");
    println!("Readme:\n{}", readme);


    // 读取当前文件所在目录下的 example.txt 文件内容
    if let Some(parent) = directory.parent() {
        let file_path = parent.join("example.txt");
        let config = std::fs::read_to_string(file_path).unwrap();
        println!("Config:\n{}", config);
    }
}